package com.sisgesbyte.dao.utilDao;

import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;

public class CreaFiltroSqlString {

	public CreaFiltroSqlString(){
		
	}
	public String concatenar(FiltrosSQLBean filtrosSql) {
		
		StringBuilder jpql = new StringBuilder();
		StringBuilder sql = new StringBuilder();
		
		int i=0;
		if(filtrosSql.getListaFiltros() != null && filtrosSql.getListaFiltros().size() > 0 ){
			boolean existe = false;
			jpql.append("where ");
			for(FiltrosBean ls : filtrosSql.getListaFiltros() ){
				if(ls.getOperador().equalsIgnoreCase("is")){
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" is ");
						jpql.append("?");
						jpql.append(++i);
						jpql.append(" and ");
					}
				}
				if(ls.getOperador().equalsIgnoreCase(">")){
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" > ");
						jpql.append("?");
						jpql.append(++i);
						jpql.append(" and ");
					}
				}
				if(ls.getOperador().equalsIgnoreCase("<")){
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" < ");
						jpql.append("?");
						jpql.append(++i);
						jpql.append(" and ");
					}
				}
				if(ls.getOperador().equalsIgnoreCase("=")){
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" = ");
						jpql.append("?");
						jpql.append(++i);
						jpql.append(" and ");
					}
				}
				if(ls.getOperador().equalsIgnoreCase("in")){
					
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" in ");
						jpql.append(" ( ");
						StringBuilder colum = new StringBuilder();
						if(ls.getNumeroValores() == 0){
							colum.append("?");
							colum.append(++i);
						}
						for (int j = 0; j < ls.getNumeroValores(); j++) {
							colum.append("?");
							colum.append(++i);
							colum.append(",");
						}
						try{
							jpql.append(colum.toString().substring(0, colum.length()-1));
						}catch(Exception e){
							
						}
						jpql.append(" ) ");
					}
					jpql.append(" and ");
					
				}
				if(ls.getOperador().equalsIgnoreCase("between")){
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(" between ");
						jpql.append(" ?");
						jpql.append(++i);
						jpql.append(" and ");
						jpql.append(" ?");
						jpql.append(++i);
					}
					jpql.append(" and ");
				}
				if(ls.getOperador().equalsIgnoreCase("like")){
	
					StringBuilder colum = new StringBuilder();
					jpql.append(" concat(");
					
					for(String campos : ls.getCampos()){
						existe=true;
						colum.append(campos.toLowerCase());
						colum.append(",");
					}
					jpql.append(colum.toString().substring(0, colum.length()-1));
					jpql.append(") ");
					jpql.append(" ilike ");
				//	jpql.append(" '%");
					jpql.append("?");
					jpql.append(++i);
				//	jpql.append("%' ");
					jpql.append(" and ");
	
				}
				//fecha por año
				if(ls.getOperador().equalsIgnoreCase("fecha1")){
					jpql.append(" TO_CHAR(");
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(",");
						jpql.append("YYYY");
					}
					jpql.append(") ");
					jpql.append(" = ");
					jpql.append("?");
					jpql.append(++i);
					jpql.append(" and ");
				}
				//fecha por año y mes
				if(ls.getOperador().equalsIgnoreCase("fecha2")){
					jpql.append(" TO_CHAR(");
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(",");
						jpql.append("YYYY-MM");
					}
					jpql.append(") ");
					jpql.append(" = ");
					jpql.append("?");
					jpql.append(++i);
					jpql.append(" and ");
				}
				//fecha por año y mes
				if(ls.getOperador().equalsIgnoreCase("fecha3")){
					jpql.append(" TO_CHAR(");
					for(String campos : ls.getCampos()){
						existe=true;
						jpql.append(campos.toLowerCase());
						jpql.append(",");
						jpql.append("YYYY-MM-dd");
					}
					jpql.append(") ");
					jpql.append(" = ");
					jpql.append("?");
					jpql.append(++i);
					jpql.append(" and ");
				}
			}
			if(existe){
				sql.append(jpql.toString().substring(0, jpql.length()-4));
			}
		}
		
		if(filtrosSql.getCampoOrden() !=null && filtrosSql.getCampoOrden().length() > 0){
			StringBuilder orden = new StringBuilder();
			orden.append(" order by ");
			orden.append(filtrosSql.getCampoOrden());
			orden.append(" ");
			orden.append(filtrosSql.getTipoOrden());
			sql.append(orden.toString());
		}
		
		if(filtrosSql.getLimiteFilas() != null && filtrosSql.getLimiteFilas() == true){
			StringBuilder limites = new StringBuilder();
				limites.append(" limit ");
				limites.append("?");
				limites.append(++i);
				if(filtrosSql.getFilaInicio() !=null && filtrosSql.getFilaInicio() == true){
					limites.append(" offset ");
					limites.append("?");
					limites.append(++i);
				}
			sql.append(limites.toString());
		}
			//System.out.println(sql.toString());	
		return sql.toString();
	}
}
